import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

# 设置 matplotlib 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体，SimHei 是 Windows 系统下常见的中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

# 生成随机数组，将数据量改为 100
arr = np.random.randint(0, 1000, 100)

# 冒泡排序生成器函数，用于逐步展示排序过程
def bubble_sort_generator(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
            yield arr

# 创建图形和坐标轴
fig, ax = plt.subplots()
# 设置图表标题
ax.set_title('冒泡排序可视化')
bar_rects = ax.bar(range(len(arr)), arr, align="edge")

# 更新函数，用于更新每一帧的图形
def update(frame):
    for rect, val in zip(bar_rects, frame):
        rect.set_height(val)
    return bar_rects

# 创建动画
ani = animation.FuncAnimation(
    fig,
    func=update,
    frames=bubble_sort_generator(arr.copy()),
    interval=10,  # 适当增大间隔，方便观察
    repeat=False,
    save_count=len(arr) ** 2
)

# 显示图形
plt.show()

